跳到主要内容

OAuth 2.0是什么

OAuth 2.0是什么

OAuth 2.0 是一个授权框架,它允许一个应用程序(例如“知乎”)在征得你的同意后,安全地访问你在另一个服务(例如“微信”)上的资源(例如你的微信头像和昵称),而无需将你的微信密码告诉知乎。

比较多的应用场景就是三方登入

OAuth 2.0解决了什么问题

在 OAuth 2.0 出现之前,要完成上述场景,通常有以下几种不安全或笨拙的方式:

  • 密码反模式:

    • 做法:知乎直接让你输入微信的用户名和密码,然后用你的密码去微信获取数据。

    • 问题:

      • 极度危险:知乎会看到并可能存储你的微信密码。

      • 权限过大:知乎不仅能拿到你的头像昵称,还能以你的身份做任何事,比如查看私信、发朋友圈等。

      • 无法撤销:除非你修改微信密码,否则无法阻止知乎继续访问。

      • 密码泄漏:如果知乎被黑客攻击,你的微信密码就泄露了。

  • 其他笨拙方式

    • 手动导出数据再上传,过程繁琐,用户体验极差。

所以,OAuth 2.0 的核心就是解决“安全地委托授权”这个问题。 它确保了:

  • 应用(知乎)无法拿到你的密码。

  • 授权是受限的(知乎只能获取你同意的特定信息,比如头像和昵称,而不能看你的私信)。

  • 授权是可撤销的(你可以随时在微信的设置里取消对知乎的授权)。

一个生动的比喻:酒店房卡

想象一下你去一家酒店入住:

  1. 你(资源所有者) 在前台办理入住,想进入 你的房间(受保护的资源,在微信上)。

  2. 前台(授权服务器,由微信运营) 验证你的身份(通过身份证和预订信息)。

  3. 验证通过后,前台不会给你一把能打开所有房间的 万能钥匙(你的微信密码),而是给你一张 房卡(访问令牌 Access Token)。

  4. 这张房卡是 有特定权限的:只能打开你指定的那间房(只能访问头像和昵称),并且通常有有效期(比如住几天)。

  5. 你使用这张房卡就可以开门进入房间(知乎使用令牌访问你的微信数据)。

  6. 退房时(撤销授权),房卡就失效了。

在这个比喻中,OAuth 2.0 就是这套发放和管理“房卡”的标准流程。

OAuth 2.0 的核心角色与流程

为了理解它是如何工作的,我们需要了解其中的四个关键角色:

  • 资源所有者:就是你,拥有数据并有权授予访问权限的用户。

  • 客户端:想要访问你数据的第三方应用(例如“知乎”)。

  • 授权服务器:负责验证你的身份并颁发令牌(Access Token)的服务(由“微信”提供)。这是你点击“同意授权”按钮时面对的界面。

  • 资源服务器:存储你受保护数据的API服务器(由“微信”提供)。它接收并验证令牌,然后返回请求的数据。

总结:OAuth 2.0 的优势

  • 安全性:用户密码永远不会暴露给第三方应用。

  • 可控性:用户可以清晰地看到并管理授权给每个应用哪些权限,并且可以随时撤销。

  • 灵活性:适用于 Web 应用、移动应用、单页应用、桌面应用等多种场景。

  • 标准化:提供了一个行业标准框架,简化了开发者的集成工作。

一个常见的误解:OAuth 2.0 ≠ 认证

OAuth 2.0 是关于 授权,而不是 认证。

  • 授权:是关于 权限(这个应用被允许做什么?)。

  • 认证:是关于 身份(用户是谁?)。

在上面的例子中,OAuth 2.0 流程让知乎获得了访问你微信头像的 权限。

但知乎如何知道这个权限背后对应的 用户身份(你的知乎账号)呢?

这通常需要结合另一个协议 OpenID Connect,它在 OAuth 2.0 之上增加了一个身份层,专门用于解决认证问题。

我们常说的“第三方登录”其实是 OAuth 2.0 + OpenID Connect 共同实现的。

我进需要接入三方登入,不需要给三方授权,需要 OAuth 2.0

需要

比如我们想要接入微信登入。这时候的角色定义

  • 资源所有者:你的用户

  • 资源服务器:微信(它存着用户的头像、昵称等数据)

  • 客户端:你的网站

  • 授权服务器:也是微信(它负责问用户是否同意授权)

你的网站是 OAuth 2.0 流程中的“客户端”,而不是授权方。你需要实现的是 OAuth 2.0 的客户端逻辑,而不是服务器端逻辑。

这个过程可以分解为以下几个必须由你的网站完成的步骤:

1. 发起授权请求

你的网站需要在“使用微信登录”按钮后面生成一个符合 OAuth 2.0 标准的 URL,并将用户重定向到微信的授权页面。

https://open.weixin.qq.com/connect/oauth2/authorize?
appid=你的APPID
&redirect_uri=你的回调地址
&response_type=code
&scope=snsapi_login
&state=随机防CSRF字符串

2. 处理授权回调

用户在微信上点击“同意”后,微信会带着一个临时的 授权码(code) 跳转回你事先在微信开放平台注册好的回调地址(Redirect URI)。

你的网站必须有一个接口(比如 /oauth/wechat/callback)来接收这个请求,并从中提取出 code。如果这一步你不做,你就拿不到这个关键的 code。

3. 用授权码交换访问令牌

你的网站后端需要拿着这个code 以及你的AppSecret,再向微信的服务器发起一个后端到后端的请求,去交换最终的访问令牌(Access Token)

POST https://api.weixin.qq.com/sns/oauth2/access_token?
appid=你的APPID
&secret=你的APPSECRET
&code=上一步拿到的code
&grant_type=authorization_code

4. 使用访问令牌获取用户信息

最后,你的网站再用这个 Access Token 去调用微信的 API(例如 https://api.weixin.qq.com/sns/userinfo?access_token=...),才能安全地拿到用户的昵称、头像等基本信息,并完成在你网站上的登录或注册流程。